home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Library / +ORC / Orc pac 9A / HOWTO91.TXT < prev    next >
Encoding:
Text File  |  2000-05-25  |  29.8 KB  |  625 lines

  1.  
  2.                        HOW TO CRACK, BY +ORC, A TUTORIAL
  3.                                        
  4.    
  5.      _________________________________________________________________
  6.    
  7.    
  8.    
  9.    Lesson 9 (1): How to crack Windows, Hands on
  10.      _________________________________________________________________
  11.    
  12.    
  13.    
  14.    [Winformant][Snap32]
  15.      _________________________________________________________________
  16.    
  17.    
  18.    
  19.   THE [DATA_CONSTRAINT] TRICK - [WINFORMANT 4]
  20.      I have chosen an older windows application for Win 3.1.
  21. (WIN4MANT.EXE, 562271 bytes, Version 1.10, by Joseph B. Albanese;
  22. you'll find it searching the web with the usual tools, see how
  23. to do it at the end of this lesson), in order to show you how to
  24. use a nice little trick, at times really useful in cracking
  25. password protected programs: [data_constraint]. Inside almost all
  26. protection routines, as you have already learned, there is a
  27. moment when on the stack the ECHO of the real, "correct"
  28. passnumber or password appears. The location of this ECHO varies,
  29. but most of the time it'll be in a range of +- 0x90 bytes from
  30. one of the locations where the user input dwells. This is due to
  31. datadump windows constraints inside the tools used by the
  32. protectionists... but this use is bound to diminish... especially
  33. after this lesson :=)
  34.  
  35. [WINFORMANT CRACKING]
  36.  This application is -per se- crappy, I doubt you'll ever use
  37. it... but its curious (and pretty rare) "deactivate" mode is
  38. nevertheless very interesting for us: you can "unregister"
  39. Winformant on the fly if you feel the need to.
  40.  This feature is pretty useful for scholars that like to
  41. investigate password algorithms with valid and invalid codes
  42. without having to reinstall every time to delete a valid code.
  43. For your cracking exercises choose programs that have
  44. "REVERSIBLE" protections (rare) or that can be re-registered a
  45. billion times (more frequent). Programs that keep the valid
  46. registration on *.ini or special files will also do the job: you
  47. just change a couple of lines to "unregister" them.
  48.  The trick of this lesson: [data_constraint], or "password
  49. proximity", bases on the protectionist's need to keep an eye on
  50. the protection "working" when he assembles it. He must "see" the
  51. relationships between USER INPUT NUMBER, USER INPUT TRANSFORMED
  52. and the CORRECT NUMBER ANSWER (in our jargon: the "Bingo"). These
  53. relationships must be constantly checked In order to debug the
  54. protection code. Mostly they will dwell TOGETHER inside a small
  55. stack area, allowing them to be "seen" in the SAME watchwindow.
  56. Most of the time, therefore, the "ECHO" will "materialize"
  57.  
  58. shortly not very far away from one of the locations of the USER
  59. INPUT. Let's crack:
  60.  
  61. * Fire Winice and then Winformant
  62. * Choose HELP and then choose REGISTRATION
  63. * Fill the registration fields with "+ORC+ORC" as "Registrant"
  64. and "12121212" as "Activation" code (use whatever you fancy).
  65. CTRL+D              ;switch to Winice
  66. :task               ;let's see what's the name of this crap
  67. TaskName  SS:SP StackTop StackBot StackLow TaskDB  hQueue  Events
  68. WINWORD   1AD7:85F2 4A52  8670      7532     1247    122F    0000
  69. PROGMAN   1737:200A 0936  2070      1392     066F    07F7    0000
  70. DISKOMAT *2C5F:6634 1D3C  6AC6      5192     2CB7    2C9F    0000
  71.  
  72. :hwnd DISKOMAT      ;which window is getting the input?
  73. WinHandle   Hqueue  QOwner    Class Name        Window Procedure
  74. 0EB4(0)      2C9F    DISKOMAT  #32769            04A7:9E6B
  75.  0F34(1)     2C9F    DISKOMAT  #32768            USER!BEAR306
  76.  365C(1)     2C9F    DISKOMAT  #32770            2C3F:0BC6
  77.   36BC(2)    2C9F    DISKOMAT  Button            2C3F:1CEA
  78.   3710(2)    2C9F    DISKOMAT  Edit              2C3F:24BE
  79. ... and many more irrelevant windows.
  80.  
  81. Let's pinpoint the code, here the relevant window is the first
  82. "Edit" one, for obvious reasons (more on this later).
  83. :bmsg 3710 wm_gettext           ;set breakpoint
  84. CTRL+D                          ;run the babe until you get:
  85. Break Due to BMSG 3710 WM_GETTEXT C=01
  86.   Hwnd=3710 wParam=0050 lParam=2C5F629A msg=000D WM_GETTEXT
  87. 2C3F:000024BE B82F2C            MOV     AX,2C2F
  88. So! Now we have "pinpointed" the babe (more on "pinpointing"
  89. later). Let's snoop around a little: look at the stack to fetch
  90. your babe's last call (if it does not show immediately, just keep
  91. pinpointing, for instance on GetWindowText() or do a BPRW
  92. diskomat (very useful), and then try and retry the stack...
  93. should this too fail to work, search for your input in memory (in
  94. the 30:0 lffffffff selector, as usual) and breakpoint range on
  95. it with ReadWrite, and then stack, stack, stack... until you get
  96. the "real" list of calls coming from your babe's protection.
  97. :stack              ; let's see
  98. USER(19) at 073F:124C [?] through 073F:1239
  99. CTL3D(02) at 2C3F:0D53 [?] through 2C3F:0D53
  100. DISKOMAT(01) at 2C97:20B9 [?] through 2C97:20B9
  101. DISKOMAT(01) at 2C97:3D94 [?] through 2C97:3D94
  102. DISKOMAT(01) at 2C97:49E2 [?] through 2C97:4918
  103. DISKOMAT(04) at 2C7F:EA20 [?] through 2C7F:EA20
  104. USER(01) at 04A7:19BE [?] through USER!GETWINDOWTEXT
  105. == CTL3D(02) at 2C3F:24BE [?] through 04A7:3A3Cµ
  106.  
  107.  Beautiful stack fishing! Do immediately a BPX on babe:EA20.
  108. 2C7F:EA35 9A25ABA704   CALL   USER!GETWINDOWTEXT
  109. 2C7F:EA3A 8D46AE       LEA    AX,[BP-52]     ;load ptr "+ORC+ORC"
  110. 2C7F:EA3D 16           PUSH   SS   ;save pointer segment
  111. 2C7F:EA3E 50           PUSH   AX   ;save pointer offset
  112. 2C7F:EA3F 9A768D872C   CALL   2C87:8D76; get strlen "ORC+ORC"
  113. 2C7F:EA44 83C404       ADD    SP,+04
  114. 2C7F:EA47 3D2800       CMP    AX,0028
  115. 2C7F:EA4A 762C         JBE    EA78
  116. ...
  117. 2C7F:EA97 8D46AE       LEA    AX,[BP-52]     ;load ptr "+ORC+ORC"
  118. 2C7F:EA9A 16           PUSH   SS     ;various algors on input
  119. 2C7F:EA9B 50           PUSH   AX     ;follow here, we do not
  120. ...                                  ;need to care
  121. 2C7F:EAB2 0F851101     JNE    EBC7
  122. 2C7F:EAB6 8D8E5CFF     LEA    CX,[BP+FF5C]  ;ptr "12121212"
  123. 2C7F:EABA 16           PUSH   SS
  124. 2C7F:EABB 51           PUSH   CX
  125. 2C7F:EABC 9A768D872C   CALL   2C87:8D76 ;get strlen "12121212"
  126. 2C7F:EAC1 83C404       ADD    SP,+04
  127. 2C7F:EAC4 50           PUSH   AX
  128. 2C7F:EAC5 8D865CFF     LEA    AX,[BP+FF5C] ;ptr "12121212" HERE!
  129. 2C7F:EAC9 16           PUSH   SS
  130. 2C7F:EACA 50           PUSH   AX
  131. ...etc, various algors on input follow here
  132.  
  133.   OK, it's enough: now obviously follows the code that
  134. "algorithmize" the number string, and then, somewhere, you'll
  135. have the hideous compare that divides good guys and bad crackers.
  136. You could examine, and crack, and search...
  137.   BUT NOW IT'S THE "MAGIC MOMENT" OF THE ECHO! We know and *feel*
  138. it: The echo must be somewhere... how do we find it? Searching
  139. "12121212" in memory fishes at least 10 different locations...
  140. :s 30:0 lffffffff '12121212'
  141. Pattern Found at 0030:0005AD6A
  142. .... (7 more)
  143. Pattern Found at 0030:80509D6A
  144. Pattern Found at 0030:8145AD6A
  145.  Should we look for all occurrences of string '12121212',
  146. starting with the two at 80000000, dumping +-0x90 around it...
  147. until we find the echo? We could, and it would work, but that's
  148. not zen... that's boring! In other protections these locations
  149. could proliferate on purpose, to deter the casual cracker. There
  150. must be some other way... And lo and behold! YES! There is a
  151. quicker way... THE LAST loading of the numeric input string in
  152. the code (the one after the strlen count) is the "right" one for
  153. our cracking purposes, coz protections follow (mostly) this
  154. pattern (remember: we are inside a "stack-heavy" section of the
  155. code... if you want to crack higher I suggest you read some good
  156. literature about stack working, stack tricks and stack magics
  157. with the Intel processors):
  158.      LOAD NAMEString - COUNT NAMEStringLen
  159.  
  160.      LOAD NAMEString - TRANSFORM NAMEString
  161.      LOAD CODEString - COUNT CODEStringLen
  162.      LOAD CODEString
  163.                *ECHO must be here*
  164.      TRANSFORM CODEString
  165.                *ECHO must be here*
  166.      COMPARE TRANSFORMED_NAMEString WITH TRANSFORMED_CODEString
  167.  
  168.   This means that at line
  169. 2C7F:EAC5 8D865CFF   LEA  AX,[BP+FF5C]  ;ptr "12121212"
  170. you'll already have your echo somewhere... just dump the memory
  171. around the pointer [BP+FF5C]:
  172. :d 2c5f:61e8   ;these numbers will differ in your computer
  173. 02 62 2F 06 02 00 26 2E-A3 4E A3 4E 01 00 38 30  .b/...&..N.N..80
  174. 33 37 2D 36 34 36 2D 33-38 33 36 00 01 06 02 00  37-646-3836.....
  175. 2F 06 75 62 C3 2E B7 04-F2 24 2F 06 CE 6E 2F 06  /.ub.....$/..n/.
  176. 49 00 5A 00 01 00-04 2C 2F 06 AE 24 36 62 00 00  I.Z......,/..$6b
  177. 74 62 7A 2E B7 04 36 62-01 00 C2 62 2F 2C 26 2E  tbz...6b...b/,&.
  178. 03 01 BA 0F AE 24 5F 02-C9 01 5E 02 BA 01 5F 02  .....$_...^..._.
  179. 31 32 31 32 31 32 31 32-00 0C 00 BC 02 00 00 00  12121212........
  180. 00 49 00 BA 0F-AE 24 F2 24 2F 06 00 00 00 00 00  ....I....$.$/...
  181. AF 17 00 E2 5F-7A 62 FE FF 79 1B BA 0F 00 00 00  ......._zb..y...
  182. 96 0B 01 00 02 4E 00-37 01 8A 62 D2 0F 8F 17 00  .....N..7..b....
  183. 2F 06 00 37 01-98 62 20 10 16 03 2F 06 00 00 00  /.....7..b .../.
  184. C2 62 2B 4F 52 43 2B 4F-52 43 00 0D AE 24 2F 06  .b+ORC+ORC......
  185.  
  186.  Look at this dump: everybody is there! The stack pointers points
  187. in the middle, at string "12121212". 0x50 bytes before it you'll
  188. find our good old ECHO (i.e. the CORRECT passnumber) and 0x50
  189.  
  190. bytes afterwards you'll see your handle: here "+ORC+ORC".
  191.      It's cracked! The code for my "+ORC+ORC" is 8037-646-3836...
  192. Now begin your assignments: if you rally want to learn cracking:
  193. -    "Unregister" and find anew your own code for your own
  194.      handle. *DO NOT* use serial numbers with any other name
  195.      that your own handle, that's miserable stealing, not
  196.      cracking. I'll begin to punish the serial#_aficionados on
  197.      the Web, coz I like real outlaws, but I detest stupid
  198.      pickpockets.
  199. -    Study the two coding algorithms, the one for the input name
  200.      and the one for the input number, this will be very useful
  201.      for your future cracking sessions.
  202. -    Find the "Compare", i.e. the code that sets the two usual
  203.      flags "good guy, you may move on" and "bad cracker, beggar
  204.      off", and
  205. -    Create a "real" crack for this protection, that will allow
  206.      anybody you think deserves it, with any name and any
  207.      password number, to get through.
  208.  
  209. [CRACKING SNAP 32]
  210.      Snap 32  (SNAP32.EXE 356.352 bytes, 24/11/95,  Version 2.54,
  211. by Greg Kochaniak) is a "snapshot" shareware program for Windows
  212. 95, that allows users to save the screen, parts of it, or a
  213. single window. It's a very common 'try before you buy' program,
  214. limited to 30 days use. You'll find it everywhere on the Web. If
  215. you do not know how to search the Web (poor guy!), learn at the
  216. end of this lesson the correct procedure to find all the files
  217. you need on the Net and get them automatically emailed to you
  218. (that's something you should learn: SEARCHING! It's even more
  219. important than cracking!).
  220.      Snap32 is not very interesting (I don't think I used it more
  221. than a couple of times), but its protection is: in order to (try
  222.  
  223. to) deter casual crackers it does not compare strings, it
  224. compares a "magic" sum (from Namestring) with another magic sum
  225. (from Numberstring). And:
  226. *    SUMS magics inside the GDI, not inside its own code;
  227. *    USES a look_up table for input validation instead of
  228.      "plain" code;
  229. *    COMPARES the "magic" manipulation from input NUMBER with
  230.      the "magic" manipulation from input NAME.
  231.  
  232.  
  233.   The cracking procedure for most of these windows programs is
  234. pretty simple and relatively straightforward:
  235.  
  236. 1)   SEE THE NAME OF YOUR BABE AND ITS QUEUE SELECTOR
  237. :task     ;This is the Winice95 command you type after firing
  238. snap32 and getting at the "Enter License" nag window:
  239.  
  240. TaskName SS:SP     StckTp   StckBt  StckLw TaskDB  Hqueue  Events
  241. Snap32   0000:0000 006 AC000 006B0000       270E    D27    0000
  242.  
  243. OK, the babe is Snap32,it's HQUEUE is 0xD27, it's TaskDB is
  244. 0x27OE, orright.
  245.  
  246. 2)   SEE THE MODULES OF YOUR BABE:
  247. :map32 snap32       ;Your command
  248. Owner     Obj Name  Obj#  Address        Size      Type
  249. SNAP32    .text     0001  0137:00401000  00043000  CODE  RO
  250. SNAP32    .rdata    0002  013F:00444000  00002E00  IDATA RO
  251. SNAP32    .data     0003  013F:00447000  00009000  IDATA RW
  252. SNAP32    .idata    0004  013F:00471000  00001C00  IDATA RW
  253. SNAP32    .rsrc     0005  013F:00473000  00001600  IDATA RO
  254. SNAP32    .reloc    0006  013F:00475000  00004C00  IDATA RO
  255.  
  256. OK, so the code is in selector 137:(as usual), and you have there
  257. 43000 bytes of code from 401000 to 401000+43000; the DATA,
  258. ReadWrite and ReadOnly, are in selector 13F: (as usual).
  259.  
  260. 3) SEE THE HANDLE OF THE PROTECTION "NAG" WINDOW
  261. :hwnd snap32             ;Your command
  262. Window Handle  Hqueue  SZ  Qowner   Class Name Window Procedure
  263.  0350(1)       0D27    32  SNAP32   #02071     144F:0560
  264.   0354(2)      0D27    32  SNAP32   #02071     17CF:102E
  265.   ... and many more windows that we do not care of.
  266.  
  267.   OK, so, for our cracking purposes, it's Handle 0x350. Most of
  268. the times the "nag" window you want to crack will be the first
  269. one in the hwnd listing (coz it was the last one to appear).
  270. Watch the number in parentheses that follows the Whandle: (1) is
  271. a mother, (2) are "children" windows. At times you'll find under
  272. "Class Name" something like "Edit" (see before the Winformant
  273. cracking)... SNIFF THERE! At times the "Window Procedure" code
  274. location in a list of more than twenty, will be slightly
  275. different for one or two windows... SNIFF THERE!
  276.  
  277. 4) BREAKPOINT MESSAGE WM_GETTEXT (or any other WM_ that you can
  278. think of in order to "pinpoint" the code of our babe).
  279. "Pinpointing" the code is extremely important in windows
  280. cracking... this idiotic OS moves code, data and stack out and
  281. inside the pages all the time... so you'll keep getting on
  282. "INVALID" sections without a correct pinpointing. Good
  283. Pinpointing points are in general:
  284.   BMSG xxxx WM_GETTEXT   (good for passwords)
  285.   BMSG xxxx WM_COMMAND   (good fro OK buttons)
  286.   BPRW *your babe* TW    (good for tracking)
  287.   u USER!GETWINDOWTEXT   (u and then BPX inside the code)
  288.   u GETDLGITEM           (for the Hwnd of an Item inside a
  289.                          Dialog Box)
  290.   CSIP NOT GDI           (if you have too many interferences)
  291.   u USER!SHOWWINDOW      (bpx with counter occurrence to get to
  292.                          the "right" window)
  293.   u GETSYSTEMTIME        (for "time-crippled" software)
  294. and many others pinpointing points you'll learn. If you are
  295. really desperate for pinpointing, just do a BMSG xxxx WM_MOVE and
  296. then move the nag window, this will always work. Let's go on:
  297.  
  298. :bmsg 350 wm_gettext     ;Your command
  299. OK, so the code is ready to be pinpointed.
  300.  
  301. 5)RUN THE PROGRAM TO THE BREAKPOINT:
  302. CTRL+D                   ;Your command to exit Winice and run
  303.                          until it pops out at breakpoint
  304. OK, now you pop out inside Winice somewhere... (look at the stack
  305. to know where) so the code has been pinpointed.
  306.  
  307. 6) SEARCH THE DATA AREA for your input string (4 Gigabytes from
  308. 30:0... remember that DATA are *always* in 30:0 to 30:FFFFFFFF
  309. and CODE is *always* in 28:0 to 28:FFFFFFFF). In most protection
  310. the "registration_number" string must match the "username"
  311. string, which cannot be constrained, in order to allow users to
  312. choose whatever stupid name they fancy. Some protections requires
  313. fixed symbols inside the "username" string, though... in these
  314. rare eventualities, just apply to the "username" string what
  315. we'll do here with the "registration_number" string. The point
  316. to remember is: begin always with the protection fumbling your
  317. number, crack only if necessary the protection that fumbles your
  318. name. Let's search now.
  319.  
  320. :s 30:0 lffffffff '12121212'  ;Your command
  321.      Pattern Found at 0030:80308612
  322.  
  323. 80000000 is good. Lower era videos, mirrors and BIOS, higher
  324. (around C0000000) you have the OS dustbins... the point to
  325. remember is: investigate always FIRST the 80000000 locations.
  326.  
  327. 7)   BREAKPOINT ON MEMORY RANGE ON THIS STRING.
  328. By the way: prepare a watch window  dex 3 es:di, you'll soon see
  329. how useful such an automated watchwindow is in password cracking.
  330.  
  331. :bpr 30:80308612 30:80308612+8 RW  ;Your command
  332.  
  333. OK Now we'll begin to dig out the relevant parts of the code.
  334. Remember that you must breakpoint *every* copy of the string that
  335. protection generates. A typical copy routine, very frequently
  336. used in windows copy protection schemes, dwells inside
  337. KERNEL!HMEMCPY (+0076):
  338.  
  339. 0117:9E8E 66C1E902      SHR     ECX,02
  340. 0117:9E92 F36766A5      REPZ MOVSD      ;makes a copy in es:di
  341. 0117:9E96 6659          POP     ECX
  342. 0117:9E98 6683E103      AND     ECX,+03
  343. 0117:9E9C F367A4        REPZ MOVSB
  344. 0117:9E9F 33D2          XOR     DX,DX
  345.  
  346. In fact, this piece of copying code is so often used for password
  347. verifications that sometimes you just need to bpx on 0117:9E92
  348. to get the correct stack sequence... but let's, for now, continue
  349. without such little tricks: just keep on BPRring (Breakpoint on
  350. memory range) all copies that protection makes.
  351.  
  352. 8) LET THE BABE RUN, it will breakpoint on all manipulations of
  353. your input string. One of them will lead to the magic.
  354. 8.1.)     VALIDATION phase
  355. There are many routines that check and "validate" your inputs.
  356. The most common ones check that your numbers ARE really numbers,
  357. i.e. in the range 0x30-0x39. Usually this is done with:
  358.           CMP  EAX,+30
  359.           JB   no_number
  360.           CMP  EAX,+39
  361.           JA   no_number
  362. At times the protectionists use TABLES instead... The number
  363. itself is used as a pointer to a "ready made" table where the
  364. relevant magic can be used as a protection. Imagine that a number
  365. 4  in your input points to a code section that throws you
  366. immediately outside the validation routine... or imagine that a
  367. number 7, if found in your input, fetches a magic code that
  368. removes the whole program from your harddisk (or worse): "Ah, ah!
  369. Stupid cracker will never know that he should not have used
  370. number 4... and definitely not number 7! Next time he'll
  371. learn..." Yes, tables have been used for such nasty tricks.
  372. Here the relevant code for the "validation" part of our
  373. protection (still checking my favourite input string '12121212'):
  374. :check_if_valid
  375. 0137:4364AE 8A16       MOV     DL,[ESI] ;load license number
  376. 0137:4364B0 33C0       XOR     EAX,EAX  ;zero AX
  377. 0137:4364B2 668B0451   MOV     AX,[ECX+2*EDX] ;look table for 84
  378. 0137:4364B6 83E008     AND     EAX,+08  ;OK if AND'S TO zero
  379. 0137:4364B9 85C0       TEST    EAX,EAX  ;and therefore
  380. 0137:4364BB 7403       JZ      004364C0 ;go on
  381. 0137:4364BD 46         INC     ESI      ; ready for next number
  382. 0137:4364BE EBCD       JMP     0043648D
  383. :strip_-_&_+_signs
  384. 0137:4364C0 33DB       XOR     EBX,EBX  ;clean BX
  385. 0137:4364C2 8A1E       MOV     BL,[ESI] ;load license number
  386. 0137:4364C4 46         INC     ESI      ;ready for next
  387. 0137:4364C5 8BFB       MOV     EDI,EBX  ;save copy
  388. 0137:4364C7 83FB2D     CMP     EBX,+2D  ;is it a "-"?
  389. 0137:4364CA 7405       JZ      004364D1
  390. 0137:4364CC 83FB2B     CMP     EBX,+2B  ;is it a "+"?
  391.  
  392. 8.2.)     MANIPULATION (summing magic numbers)
  393. Your wisely set breakpoints on memory range for the occurrence
  394. of the string "12121212" will pop you out, inter alia, inside
  395. following piece of code (note how this part of protection dwells
  396. inside GDI, and  NOT inside the code selector of snap32):
  397. 0557:11BD 33C0         XOR  EAX,EAX        ;zero AX
  398. 0557:11BF 66648B06     MOV  AX,FS:[ESI]    ;load number
  399. 0557:11C3 83C602       ADD  ESI,+02        ;point to next
  400.  
  401. 0557:11C6 66833C4700   CMP  WORD PTR [EDI+2*EAX],+00
  402. 0557:11CB 0F8424010000 JE   000012F5
  403. 0557:11D1 668B0442     MOV  AX,[EDX+2*EAX] ;load from magic table
  404. 0557:11D5 03D8         ADD  EBX,EAX        ;save sum in EBX
  405. 0557:11D7 49           DEC  ECX            ;till we are done
  406. 0557:11D8 75E5         JNZ  000011BF       ;loop along
  407.  
  408. Interesting, isn't it? Protection is using this GDI routine to
  409. create a SUM (through pointers to another table) that depends on
  410. your very input numbers. We are now very near to the crack... can
  411. you *feel* it? If not, prepare yourself a good Martini Vodka!
  412. This is the correct way to do it:
  413.  * Get a "highball" glass;
  414.  * Put some ice cubes inside it (2 or 3);
  415.  * Add Martini Dry (From Martini & Rossi). Fill to 1/3;
  416.  * Add Moskowskaja Wodka (the only real Vodka). Fill to 2/3;
  417.  * Add a zest of lemon (From Malta or Southern France);
  418.  * Add a green "sound" olive (from Italy or Israel);
  419.  * Add Schweppes Indian Tonic. Fill to the brim.
  420. Sit deeper and relax, sip slowly and *feel* where the code of the
  421. protection scheme you are cracking "moves"... It's like a
  422. current... a slow tide. If you still do not believe me, just try
  423. it.
  424.  
  425. We'll now find out where protection stores the "magic" sum (and
  426. now you'll pop out inside the very own snap32 code, this is the
  427. "real" protection part):
  428.  
  429. 8.3.)     The ludicrous "HIDING" of the magic sum
  430. 0137:40437E 83C404       ADD     ESP,+04
  431. 0137:404381 8B4DE8       MOV     ECX,[EBP-18]
  432. 0137:404384 8945F0       MOV     [EBP-10],EAX  ;***HERE!***
  433. 0137:404387 68FF000000   PUSH    000000FF
  434. 0137:40438C 8D8574FBFFFF LEA     EAX,[EBP+FFFFFB74] ;load string
  435. 0137:404392 50    PUSH   EAX                      ;push it
  436. 0137:404393 E886410100   CALL    0041851E         ;manipulate
  437. 0137:404398 8D8574FBFFFF LEA     EAX,[EBP+FFFFFB74] ;load string
  438. 0137:40439E 50    PUSH   EAX                      ;push it
  439. 0137:40439F E88C210300   CALL    00436530         ;manipulate
  440.  
  441. As you can see, the protection is very simple: The "magic" sum
  442. is hidden only two lines before the further manipulations of the
  443. input string. We have found location 137:404384, here, in the
  444. CORRECT way, through bprring of the string that has been
  445. manipulated in the GDI, but actually, we could have found it
  446. quickly just checking superficially what's happening "around" all
  447. manipulations of the input string. Do we really need to follow
  448. all manipulations of our registration_number and eventually also
  449. all manipulation of our username? NO, not at all: we just set a
  450. BPR on the stack location where protection hides the sum [EBP-10]
  451. and we'll see what happens: 90% of these protections just create
  452. two sums, a sum from your username and a sum from your
  453. registration_number... somewhere there will be a compare that
  454. must use this location (or a copy of it... we'll see).
  455.  
  456. 8.4.) COMPARING THE MAGICS FROM THE TWO INPUT STRING
  457. Breakpoint on memory range on the sum location [EBP-10] that you
  458. saw in the previous code and you'll land at this piece of code:
  459. 0137:404412 E82F050000   CALL 00404946
  460. 0137:404417 83C40C       ADD  ESP,+0C
  461. 0137:40441A 3B45F0       CMP  EAX,[EBP-10] ;comp AX & magicsum
  462. 0137:40441D 740F         JZ   0040442E
  463. 0137:40441F 68C0874400   PUSH 004487C0
  464. 0137:404424 E8149E0000   CALL 0040E23D
  465. 0137:404429 83C404       ADD  ESP,+04
  466. 0137:40442C EB5B         JMP  00404489
  467. 0137:40442E 893DA0714400 MOV  [004471A0],EDI
  468. 0137:404434 85FF         TEST EDI,EDI
  469.  
  470. That's it, you have made it! We found the compare between the
  471. "username" magic number (for my "+ORC+ORC" string that's here
  472. 0x7C25621B) in AX (we do not need to know how this landed
  473. there... it's irrelevant!) and the "license_number" '12121212'
  474. (whose magic is here 0x00B8F47C) stored in [pointer-10.] How do
  475. we find now the correct INPUT number for +ORC+ORC? Well, it's
  476. easy...  the "magic number" must be the same... therefore:
  477.  
  478. Cracked=Dec(0x7C25621B)
  479. Cracked=2082824731
  480.  
  481.      That was it. Old Snap32 has been cracked. You could now
  482. prepare a crack in order to distribute this program around
  483. without its simple protection. Good cracked applications should
  484. be given free (i.e. cracked) to all the people that NEED them and
  485. do not have the money to buy them. Don't forget that in this
  486. intolerable society the 0,5% of the citizens own the 56% of the
  487. industrial capital and the 63% of the propaganda machines (data
  488.  
  489. from US researchers... therefore suspect... the real situation
  490. is probably even worser) effectively conditioning the destiny of
  491. millions of slaves, moronized by television watching. So crack
  492. the applications and give them to the people you care and the
  493. peolple that need them, but for the others... just EXPLAIN
  494. everybody how you did it... this is real help: giving knowledge,
  495. not wares. DO NOT use my handle and my codes to crack this
  496. program, get yours, I gave you mine only as an help for this
  497. cracking lesson. I have showed you the way enough... THIEFS, not
  498. crackers, use the codes that others have found. You are (gonna
  499. be) CRACKERS! Remember it, look straight ahead, crack accurately
  500. and keep your tommy in.
  501.  
  502. HOW TO SEARCH THE INTERNET FOR FILES WITHOUT MOVING A FINGER
  503.   It's amazing: most of the people roaming around inside Internet
  504. DO NOT know how to use effectively the web. I'll be very
  505. altruistic and explain how to fetch the very example of Snap32,
  506. the babe we cracked in this lesson.
  507.  
  508. 1) Choose an archie from this list (I will not explain you what
  509. an archie is, you should know it... if you do not, be ashamed):
  510.      archie.univie.ac.at      131.130.1.23        Austria
  511.      archie.belnet.be         193.190.248.18      Belgium
  512.      archie.funet.fi          128.214.6.102       Finland
  513.      archie.univ-rennes1.fr   129.20.254.2        France
  514.      archie.th-darmstadt.de   130.83.22.1         Germany
  515.      archie.ac.il             132.65.16.8         Israel
  516.      archie.unipi.it          131.114.21.10       Italy
  517.      archie.uninett.no        128.39.2.20         Norway
  518.  
  519. 2) Email a message to your archie:
  520.      To:       archie.univie.ac.at (for instance)
  521.      Subject:                      (nothing on this field)
  522.      Body:     set search sub      (substrings too)
  523.                set maxhits 140     (max 140 hits)
  524.                set maxhitspm 9     (not the same file all over)
  525.                find snap32         (we want this)
  526.  
  527. 3) After a while you'll get (per email) your answer: Here the
  528. answer from the Austrian archie
  529.  
  530. Host ftp.wu-wien.ac.at    (137.208.8.6)
  531.  Last updated 17:48  9 Aug 1995
  532.  Location: /pub/systems/windows.32/misc
  533.   FILE    -rw-r-----  128957 bytes  15:59 16 Jun 1995  snap32.zip
  534. Host space.mit.edu    (18.75.0.10)
  535.  Last updated 00:45  4 Mar 1996
  536.  Location: /pub/mydir
  537.   FILE    -rw-r--r--  407040 bytes  11:55 28 Nov 1995  snap32.exe
  538.  
  539. 4) ftpmail your file (Browsing is no good: too busy and lame).
  540. Again, I will not explain you what an FTPMAIL server is: learn
  541. it by yourself... choose a good one from this list (there are
  542. many more... you'll learn):
  543.    bitftp@vm.gmd.de                           (Germany)
  544.    ftpmail@ieunet.ie                          (Ireland)
  545.    bitftp@plearn.edu.pl                       (Poland)
  546.    ftpmail@ftp.sun.ac.za                      (South Africa)
  547.  
  548.    ftpmail@ftp.sunet.se                       (Sweden)
  549.    ftpmail@ftp.luth.se                        (Sweden)
  550.    ftpmail@src.doc.ic.ac.uk                   (United Kingdom)
  551.  
  552. To:       ftpmail@ftp.sun.ac.za.   (for instance)
  553. Subject:                           (leave blank)
  554. Body:     open space.mit.edu       (the last occurrence that
  555.                                    the archie sent)
  556.           cd/pub/mydir             (get the correct subdir)
  557.           bin                      (prepare for BINARY)
  558.           get snap32.exe           (I want this)
  559.           quit                     (bye)
  560.  
  561. 5) Your FTPMAIL server will first notice you a receipt:
  562.  
  563. FTP EMAIL response...
  564. ftpmail has received the following job from you:
  565.       reply-to +ORC
  566.       open space.mit.edu +ORC@now.here
  567.       get snap32.exe
  568. ftpmail has queued your job as: 1834131821.5514
  569. Your priority is 1 (0 = highest, 9 = lowest)
  570. Requests to sunsite.doc.ic.ac.uk will be done before other jobs.
  571. There are 14 jobs ahead of this one in the queue.
  572. 4 ftpmail handlers available.
  573. To remove send a message to ftpmail containing just:
  574. delete 1834131821.5514
  575.  
  576. After a while you'll get a second message, with your file
  577. uuencoded inside... everything has been done.
  578. YESSIR! there is absolutely no need to loose time on the WWW,
  579. "surfing" idiotically from a junk site to the next or waiting
  580. hours to download some slow file from an instable server! Wasting
  581. time of your own LIFE, that you could use to read poetry, to make
  582. love, to look at the stars, to sail slowly between the Aegean
  583. islands or to start a nice cracking session. What's the point of
  584. wasting your time when machines can perform all the searches you
  585. need better, more productively and faster than you ever could...
  586. YESSIR! You can get *everything* on the Web, and without paying
  587. your Internet provider more than a couple of dimes... Nice, isn't
  588. it?
  589.  
  590. By now, if you have followed all my lessons, you should be able
  591. to crack relatively quickly "normal" applications. There are some
  592. new projects for 1997: a cracking "university", that will allow
  593. us to prepare for the divine war against Microsoft repulsive
  594. dominion. If you do not have already chosen your handle (your
  595. "cracker" name, that's it), you may consider choosing an handle
  596. with a "+" somewhere inside it or, eventually, add a "+" to your
  597. handle. This sign is used by me and by friends that have studied
  598. and/or contributed. But a "+" in your handle ("official +ORC
  599. cracker") will mean even more:
  600. 1)   allows support from me personally (on a "do ut des" basis)
  601. 2)   allows pupils to identify each other (good for joining
  602.      forces)
  603. 3)   will open you (eventually) the doors to the "higher"
  604.      cracking university I'll set up on the Web in 1997.
  605. (I'm not getting megalomaniac... In reality I only need a "quick"
  606. method to know on which (anonymous) people I can count on for the
  607. next phase).
  608.  
  609. Well, that's it for this lesson, reader. Not all lessons of my
  610. tutorial are on the Web.
  611.      You 'll obtain the missing lessons IF AND ONLY IF you mail
  612. me back (via anon.penet.fi) with some tricks of the trade I may
  613. not know that YOU discovered. Mostly I'll actually know them
  614. already, but if they are really new you'll be given full credit,
  615. and even if they are not, should I judge that you "rediscovered"
  616. them with your work, or that you actually did good work on them,
  617. I'll send you the remaining lessons nevertheless. Your
  618. suggestions and critics on the whole crap I wrote are also
  619. welcomed.
  620.  
  621.    
  622.    E-mail +ORC
  623.    
  624. +ORC an526164@anon.penet.fi
  625.